package visiopuce.DAO;

import java.math.BigDecimal;
import java.util.ArrayList;

import org.hibernate.Query;

import visiopuce.HibernateUtil;
import visiopuce.objets.Utilisateur;

public class UtilisateurDAOImpl extends GenericDAOImpl<Utilisateur, BigDecimal> implements UtilisateurDAO {

	/** Constructeur priv� */
	private UtilisateurDAOImpl() {
	}

	/** Instance unique non pr�initialis�e */
	private static UtilisateurDAOImpl INSTANCE = null;

	/** Point d'acc�s pour l'instance unique du singleton */
	public static UtilisateurDAO getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new UtilisateurDAOImpl();
		}
		return INSTANCE;
	}

	public Utilisateur getUtilisateurByLogin(String login) {
		Utilisateur utilisateur = null;
		String sql = "SELECT u FROM Utilisateur u WHERE u.login = :login";
		Query query = HibernateUtil.getSession().createQuery(sql).setParameter("login", login);
		utilisateur = findOne(query);
		return utilisateur;
	}

	public ArrayList<Utilisateur> getPrescripteurs() {
		ArrayList<Utilisateur> utilisateurs = null;
		String sql = "SELECT u FROM Utilisateur u WHERE u.prescripteur = 1 ORDER BY u.nom";
		Query query = HibernateUtil.getSession().createQuery(sql);
		utilisateurs = (ArrayList<Utilisateur>) findMany(query);
		return utilisateurs;
	}

	public ArrayList<Utilisateur> getBiologisteByTypeAnalyse(Integer idTypeAnalyse) {
		ArrayList<Utilisateur> utilisateurs = null;
		String sql;
		if (idTypeAnalyse > 0) {
			sql = "SELECT u FROM Utilisateur u WHERE u.biologiste like '%" + idTypeAnalyse + "%' ORDER BY u.nom";
		} else {
			sql = "SELECT u FROM Utilisateur u WHERE u.biologiste is not null ORDER BY u.nom";
		}
		Query query = HibernateUtil.getSession().createQuery(sql);
		utilisateurs = (ArrayList<Utilisateur>) findMany(query);
		return utilisateurs;
	}

	public ArrayList<Utilisateur> getAnnotateurs() {
		ArrayList<Utilisateur> utilisateurs = null;
		String sql = "SELECT u FROM Utilisateur u WHERE u.annotateur = 1 ORDER BY u.nom";
		Query query = HibernateUtil.getSession().createQuery(sql);
		utilisateurs = (ArrayList<Utilisateur>) findMany(query);
		return utilisateurs;
	}

	public ArrayList<Utilisateur> getVerificateursqPCR() {
		ArrayList<Utilisateur> utilisateurs = null;
		String sql = "SELECT u FROM Utilisateur u WHERE u.verificateurqpcr = 1 ORDER BY u.nom";
		Query query = HibernateUtil.getSession().createQuery(sql);
		utilisateurs = (ArrayList<Utilisateur>) findMany(query);
		return utilisateurs;
	}

	@Override
	public Utilisateur getUtilisateurByNom(String nom) {
		Utilisateur utilisateur = null;
		String sql = null;
		Query query = null;
		if (nom.equals("Dumont")) {
			sql = "SELECT u FROM Utilisateur u WHERE u.nom like :nom and u.prenom like 'Coralie'";
			query = HibernateUtil.getSession().createQuery(sql).setParameter("nom", nom);
		} else if (nom.equals("Boulot") || nom.equals("boulot")) {
			sql = "SELECT u FROM Utilisateur u WHERE u.nom like :nom and u.prenom like 'Pierre'";
			query = HibernateUtil.getSession().createQuery(sql).setParameter("nom", nom);
		} else {
			sql = "SELECT u FROM Utilisateur u WHERE u.nom like :nom";
			query = HibernateUtil.getSession().createQuery(sql).setParameter("nom", nom);
		}
		utilisateur = findOne(query);

		return utilisateur;
	}

	@Override
	public Utilisateur getSignataireByIdPuce(Integer idPuce) {
		Utilisateur utilisateur = null;
		String sql = null;
		Query query = null;
		sql = "SELECT p.signataire FROM Puce p WHERE p.idPuce = :idPuce";
		query = HibernateUtil.getSession().createQuery(sql).setParameter("idPuce", idPuce);
		utilisateur = (Utilisateur) query.uniqueResult();
		return utilisateur;
	}

	@Override
	public Utilisateur getAnnotateurByIdPuce(Integer idPuce) {
		Utilisateur utilisateur = null;
		String sql = null;
		Query query = null;
		sql = "SELECT p.annotateur FROM Puce p WHERE p.idPuce = :idPuce";
		query = HibernateUtil.getSession().createQuery(sql).setParameter("idPuce", idPuce);
		utilisateur = (Utilisateur) query.uniqueResult();
		return utilisateur;
	}

	@Override
	public ArrayList<Utilisateur> getTechnicienneByTypeAnalyse(Integer idTypeAnalyse) {
		ArrayList<Utilisateur> utilisateurs = null;
		String sql = "SELECT u FROM Utilisateur u WHERE u.technicienne like '%" + idTypeAnalyse + "%' ORDER BY u.nom";
		Query query = HibernateUtil.getSession().createQuery(sql);
		utilisateurs = (ArrayList<Utilisateur>) findMany(query);
		return utilisateurs;
	}

	@Override
	public ArrayList<Utilisateur> getUtilisateurs() {
		ArrayList<Utilisateur> utilisateurs = null;
		String sql = "SELECT u FROM Utilisateur u WHERE u.pwd is not null AND u.pwd  is not empty AND u.pwd <> '' ORDER BY u.nom, u.idUtilisateur";
		Query query = HibernateUtil.getSession().createQuery(sql);
		utilisateurs = (ArrayList<Utilisateur>) findMany(query);
		return utilisateurs;
	}

	// @Override
	// public ArrayList<Utilisateur> getUtilisateursByType(String type) {
	// ArrayList<Utilisateur> utilisateurs = null;
	// String sql = "SELECT u FROM Utilisateur u WHERE u."+type+" = 1 ";
	// Query query = HibernateUtil.getSession().createQuery(sql)
	// .setParameter("idGroupe", idGroupe);
	// utilisateurs = (ArrayList<Utilisateur>) findMany(query);
	// return utilisateurs;
	// }

}